/*
 * Copyright (c) [2021] Huawei Technologies Co.,Ltd.All rights reserved.
 *
 * OpenArkCompiler is licensed under Mulan PSL v2.
 * You can use this software according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of Mulan PSL v2 at:
 *
 *     http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR
 * FIT FOR A PARTICULAR PURPOSE.
 * See the Mulan PSL v2 for more details.
 */
#include "compiler.h"
#include "file_utils.h"
#include "mpl_logging.h"
#include "default_options.def"

namespace maple {
std::string Cpp2MplCompiler::GetBinPath(const MplOptions &mplOptions [[maybe_unused]]) const{
  return mplOptions.GetExeFolder();
}

const std::string &Cpp2MplCompiler::GetBinName() const {
  return kBinNameCpp2mpl;
}

std::string Cpp2MplCompiler::GetInputFileName(const MplOptions &options [[maybe_unused]], const Action &action) const {
  if (action.IsItFirstRealAction()) {
    return action.GetInputFile();
  }
  return action.GetFullOutputName() + ".ast";
}

bool IsUseBoundaryOption() {
  return  opts::boundaryStaticCheck.IsEnabledByUser() || opts::boundaryDynamicCheckSilent.IsEnabledByUser();
}

bool IsUseNpeOption() {
  return  opts::npeStaticCheck.IsEnabledByUser() || opts::npeDynamicCheckSilent.IsEnabledByUser();
}

std::vector<MplOption> Cpp2MplCompiler::GetDefaultOptions(const MplOptions &options,
                                                          const Action &action [[maybe_unused]]) const {
  std::vector<MplOption> defaultOptions;
  defaultOptions.emplace_back(MplOption("--enable-variable-array", ""));
  if (options.GetIsAllAst()) {
    for (auto tmp : options.GetHirInputFiles()) {
      defaultOptions.emplace_back(MplOption(tmp, ""));
    }
    defaultOptions.emplace_back(MplOption("-o", "tmp.mpl"));
  }

  defaultOptions.emplace_back(MplOption("--output", action.GetOutputFolder()));
  defaultOptions.emplace_back(MplOption("-rootPath", FileUtils::GetInstance().GetTmpFolder()));
  if (IsUseBoundaryOption()) {
    defaultOptions.emplace_back(MplOption("--boundary-check-dynamic", ""));
  }
  if (IsUseNpeOption()) {
    defaultOptions.emplace_back(MplOption("--npe-check-dynamic", ""));
  }
  if (opts::linkerTimeOpt.IsEnabledByUser()) {
    defaultOptions.emplace_back(MplOption("-wpaa", ""));
  }
  return defaultOptions;
}

std::unordered_set<std::string> Cpp2MplCompiler::GetFinalOutputs(const MplOptions &mplOptions [[maybe_unused]],
                                                                 const Action &action) const {
  std::unordered_set<std::string> finalOutputs;
  (void)finalOutputs.insert(action.GetFullOutputName() + ".mpl");
  (void)finalOutputs.insert(action.GetFullOutputName() + ".mplt");
  return finalOutputs;
}

void Cpp2MplCompiler::AppendOutputOption(std::vector<MplOption> &finalOptions,
                                         const std::string &name) const {
  (void)finalOptions.emplace_back("-o", name);
}

}  // namespace maple
